﻿using System;
using System.Collections.Generic;
using WinForms.Framework.Base;

namespace WinForms.Framework.Core
{
    /// <summary>
    /// データベースに接続するためのインターフェースです。
    /// </summary>
    public interface IDBConnection : IDisposable
    {
        /// <summary>
        /// データベースに対して実行する SQL ステートメントまたはストアドプロシージャを取得または設定します。
        /// </summary>
        string CommandText { get; set; }

        /// <summary>
        /// データベースでトランザクションを開始します。
        /// </summary>
        void BeginTransaction();

        /// <summary>
        /// SQL データベーストランザクションをコミットします。
        /// </summary>
        void Commit();

        /// <summary>
        /// 保留中の状態からトランザクションをロールバックします。
        /// </summary>
        void Rollback();

        /// <summary>
        /// コマンドを初期化します。
        /// </summary>
        void InitCommand();

        /// <summary>
        /// パラメーターの名前と値を指定して、Parameter を ParameterCollection に追加します。
        /// </summary>
        /// <param name="name">パラメーターの名前を設定します。</param>
        /// <param name="value">パラメーターの値を設定します。</param>
        void AddParameter(string name, object value);

        /// <summary>
        /// DTO に設定されているパラメーターを全て追加します。
        /// </summary>
        /// <param name="parameters">パラメーターの名前を設定します。</param>
        void AddParameters(DTOBase parameters);

        /// <summary>
        /// SQL を実行して、結果を DTO に格納します。
        /// </summary>
        /// <typeparam name="T">結果を格納する DTO の型を設定します。</typeparam>
        /// <returns>結果を格納した DTO を返します。</returns>
        List<T> Select<T>() where T : DTOBase;

        /// <summary>
        /// SQL ステートメントを実行し、処理結果を返します。
        /// </summary>
        /// <returns>データベースの処理結果を定義する定数を返します。</returns>
        ReturnCodeDB ExecuteNonQuery();

        /// <summary>
        /// クエリを実行し、そのクエリが .NET Framework のデータ型で返す結果セットの最初の行の最初の列を返します。 余分な列または行は無視されます。
        /// </summary>
        /// <returns>.NET Framework 固有のデータ型の結果セットの最初の行の最初の列を返します。結果セットが空であるか、結果が REF CURSOR の場合、null を返します。</returns>
        object ExecuteScalar();
    }
}
